﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>霸体 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 霸体 statement prevents the current 线程 from being interrupted by other threads, or enables it to be interrupted." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>霸体</h1>

<p>防止<a href="../misc/Threads.htm">当前线程</a>被其他线程中断, 或使其能够被中断.</p>

<pre class="Syntax">
<span class="func">霸体</span> <span class="optional">OnOffNumeric</span></pre>

<h2 id="Parameters">参数</h2>
<dl>
  <dt>OnOffNumeric</dt>
  <dd>
    <p>如果参数为空或省略, 默认为 On. 否则, 请指定以下之一:</p>
    <p><strong>On</strong>: 设置<a href="../misc/Threads.htm">当前线程</a>为关键的, 这意味着它不会被其他线程中断.</p>
    <p><strong>Off</strong>: 当前线程立即成为可中断的, 无论 <a href="Thread.htm">线程 Interrupt</a> 的设置如何. 有关详情, 请参阅 <a href="#Off">霸体 Off</a>.</p>
    <p><strong>(数字)</strong>: 指定一个正数来打开 霸体, 但同时也会改变检查内部消息队列的时间间隔. 有关详情, 请参阅<a href="#Interval">消息检查间隔</a>. 指定 0 关闭 霸体.</p>
  </dd>
</dl>

<h2 id="Behave">关键线程的行为</h2>
<p>霸体 线程是 <em>不可中断的</em>; 有关详情, 请参阅<a href="../misc/Threads.htm#Behave">线程</a>.</p>
<p>关键线程在显示 <a href="MsgBox.htm">信息框</a> 或其他对话框时, 会变成可中断的. 但是, 与 <a href="Thread.htm">线程 Interrupt</a> 不同, 在用户解除对话框后这个线程会再恢复为关键的.</p>

<h2 id="Off">霸体 Off</h2>
<p>当缓冲的事件等待启动新的线程时, 使用 <code>霸体 "Off"</code> 不会导致立即中断当前线程, 而会经过平均 5ms 才发生中断. 这会导致在中断前有超过 99.999% 的可能执行了至少一行 <code>霸体 "Off"</code> 后面的代码. 可通过使用像 <code><a href="Sleep.htm">等待</a> -1</code> 或 <a href="WinWait.htm">等待窗口</a> 一个尚不存在的窗口这样的延迟手段立即产生强制中断.</p>
<p><code>霸体 "Off"</code> 会取消当前线程的不可中断性周期, 即使该线程不是关键线程, 因此会让像 <a href="../objects/GuiOnEvent.htm#Size">Size</a> 这样的事件更快或更可预测地被处理.</p>

<h2 id="Settings">线程 设置</h2>
<p>如何保存和还原当前的 霸体 设置, 请参阅 <a href="../Variables.htm#IsCritical">内_是否中断</a>. 但是, 由于 霸体 是特定于线程的设置, 因此当关键线程结束时, 底层/恢复的线程(如果有的话) 将自动是非关键线程. 因此, 不需要在结束线程之前执行 <code>霸体 Off</code>.</p>
<p>如果在<a href="../Scripts.htm#auto">the 自动执行线程</a>中没有使用 霸体, 所有的线程将会以非关键线程启动(尽管 <code><a href="Thread.htm">线程</a> "Interrupt"</code> 的设置仍然有效). 相比之下, 如果自动执行线程打开了 霸体 但随后并没有关闭过它, 每个新启动的<a href="../misc/Threads.htm">线程</a>(如 <a href="../Hotkeys.htm">热键</a>, <a href="../objects/Menu.htm">自定义菜单项</a>或<a href="SetTimer.htm">计时器</a>子程序) 都会以关键线程方式启动.</p>
<p>函数 <a href="Thread.htm">线程 "NoTimers"</a> 类似于 霸体, 除了它仅阻止被<a href="SetTimer.htm">计时器</a>中断.</p>

<h2 id="Interval">消息检查间隔</h2>
<p>指定一个正数作为首个参数(例如 <code>霸体 30</code>) 将会打开 霸体, 但同时也会改变检查内部消息队列的时间间隔(以 ms 毫秒计). 如果未指定该参数, 在 霸体 打开的状态下, 每 16ms 检查一次消息队列, 在 霸体 关闭状态下, 每 5ms 检查一次. 延长时间间隔会推迟消息/事件的到达, 给出更多的时间让<a href="../misc/Threads.htm">当前线程</a>结束. 这会减少某些 <a href="OnMessage.htm">在收到消息时()</a> 和 <a href="../objects/GuiOnEvent.htm">界面 events</a> 因为 "线程已运行" 而丢失的可能性. 然而, 像 <a href="Sleep.htm">等待</a> 和 <a href="WinWait.htm">等待窗口</a> 这样的等待型函数则无视此设定而照常检查消息(一个解决办法是 <code>动态库调用(&quot;等待&quot;, &quot;UInt&quot;, 500)</code>).</p>
  <p class="note"><strong>注意</strong>: 将消息检查间隔设置的太大会减少对多种事件的响应能力, 例如 <a href="../objects/Gui.htm">GUI</a> 窗口的重绘.</p>

<h2 id="Related">相关</h2>
<p><a href="Thread.htm">线程 (函数)</a>, <a href="../misc/Threads.htm">线程</a>, <a href="_MaxThreadsPerHotkey.htm">#单热键最大线程数</a>, <a href="_MaxThreadsBuffer.htm">#最大线程缓冲</a>, <a href="OnMessage.htm">在收到消息时</a>, <a href="CallbackCreate.htm">创建回调</a>, <a href="Hotkey.htm">热键</a>, <a href="../objects/Menu.htm">Menu 对象</a>, <a href="SetTimer.htm">设置定时器</a></p>

<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a></p>
<pre>#space::  <em>; Win+Space 热键.</em>
{
    霸体
    工具提示 "No new threads will launch 直到 after this 工具提示 disappears."
    等待 3000
    工具提示  <em>; 关闭提示.</em>
    返回  <em>; 从热键子程序中返回. 根据定义, 要恢复的任何底层线程都是非关键的.</em>
}</pre>
</div>

</body>
</html>